﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ITProject.Repository.Abstract;
using ITProject.WebUI.Models.Message;
using ITProject.Domain.Entities;

namespace ITProject.WebUI.Controllers
{
    /// <summary>
    /// Kontroler służący wysyłaniu wewnętrznych wiadomości.
    /// Autor: Jakub Szatkowski
    /// </summary>
    public partial class MessageController : Controller
    {
        IUserRepository userRepository;
        IMessageRepository messageRepository;

        /// <summary>
        /// Konstruktor przyjmujący repozytorium użytkowników i wiadomości.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="userRepo">Repozytorium użytkowników.</param>
        /// <param name="messageRepo">Repozytorium wiadomości.</param>
        public MessageController(IUserRepository userRepo,IMessageRepository messageRepo)
        {
            userRepository = userRepo;
            messageRepository = messageRepo;
        }

        /// <summary>
        /// Akcja wywołująca metode do wysłania wiadomości.
        /// Powrót do akcji generującej widok, że wiadomość wysłana.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="sendViewModel">Model widokowy wiadomości.</param>
        [Authorize]
        [HttpPost]
        public virtual ActionResult Send(MessageSendViewModel sendViewModel)
        {
            sendViewModel.controllerResult = MVC.Message.Name;
            sendViewModel.actionResult = MVC.Message.ActionNames.Sended;
            return RedirectToAction(MVC.Message.ActionNames.SendMessage,sendViewModel);
        }

        /// <summary>
        /// Metoda do właściwego wysłania wiadomości. Następuje konwersja modelu widokowego do modelu i dodanie wiadomości do repozytorium.
        /// Ścieżke do powrotu podajemy przez actionResult i contollerResult w sendMessageViewModel.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <param name="sendViewModel">Wiadomość do wysłania</param>
        /// <returns>Akcja przekazana do sendViewModel, chyba, że ktoś próbuje wysłać wiadomość do samego siebie.</returns>
        [Authorize]
        public virtual ActionResult SendMessage(MessageSendViewModel sendMessageViewModel)
        {
            Message message = MessageSendViewModel.Convert(sendMessageViewModel, userRepository);
            if (message.Receiver == message.Sender)
            {
                ViewBag.problem = "Nie możesz wysłać wiadomości do samego siebie";
                return View(MVC.Message.Views.CannotSend);
            }
            else
            {
                messageRepository.Send(message);
                return RedirectToAction(sendMessageViewModel.actionResult, sendMessageViewModel.controllerResult, new { sendMessageViewModel.parameter });
            }
        }

        /// <summary>
        /// Metoda która jest w celu wysłania wiadomości do użytkownika. Wywołuje widok uzupełnienia wiadomości.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <returns>Widok wypełnienia formularza wiadomości.</returns>
        [Authorize]
        public virtual ViewResult Send(string receiverUserName)
        {
            if (receiverUserName == null)
            {
                ViewBag.problem = "Zdefiniuj odbiorcę";
                return View(MVC.Message.Views.CannotSend);
            }
            MessageSendViewModel sendViewModel = new MessageSendViewModel();
            sendViewModel.Receiver = receiverUserName;
            sendViewModel.IdSender = userRepository.GetUserByLogin(HttpContext.User.Identity.Name).Id;
            return View(sendViewModel);
        }

        /// <summary>
        /// Metoda służąca do wyświetlenie widoku z listą wiadomości.
        /// Autor: Jakub Szatkowski
        /// </summary>
        /// <returns>Widok zwracający listę wiadomości.</returns>
        [Authorize]
        public virtual ViewResult Inbox()
        {
            IEnumerable<Message> messages=messageRepository.GetInMessages(userRepository.GetUserByLogin(HttpContext.User.Identity.Name).Id);
            IEnumerable<MessageInboxViewModel> messagesViewModel = MessageInboxViewModel.Convert(messages,userRepository);
            return View(messagesViewModel);
        }

        [Authorize]
        public virtual ViewResult Show(int messageId=-1)
        {
            if (messageId != -1)
            {
                Message message = messageRepository.GetMessageById(messageId);
                if (!message.Readed)
                    messageRepository.Read(message);
                MessageShowViewModel showViewModel = MessageShowViewModel.Convert(message, userRepository);
                return View(showViewModel);
            }
            else
                return View(MVC.Message.ActionNames.Inbox);
        }

        [Authorize]
        public virtual ActionResult Delete(int messageId)
        {
            messageRepository.Delete(messageId);
            ViewBag.Note = "Wiadomość usunięto";
            return RedirectToAction(MVC.Message.ActionNames.Inbox);
        }

        public virtual ViewResult Sended()
        {
            return View();
        }
    }
}
